package com.bestdreamer.algorithm;

/**
 * IP 地址和 int 类型互转
 * 数据库存放，提高数据库使用性能我们将字符串 IP 转换成 int 类型保存
 */
public class IpToInt {

    public static int ipToInt(String strIp){
        int[] ip = new int[4];
        // 先找到 IP 地址字符串 . 的位置
        int position1 = strIp.indexOf(".");
        int position2 = strIp.indexOf(".",position1+1);
        int position3 = strIp.indexOf(".",position2+1);
        // 每个 . 之间的字符串转换成整型
        ip[0] = Integer.parseInt(strIp.substring(0,position1));
        ip[1] = Integer.parseInt(strIp.substring(position1+1,position2));
        ip[2] = Integer.parseInt(strIp.substring(position2+1,position3));
        ip[3] = Integer.parseInt(strIp.substring(position3+1));
        return (ip[0] << 24)+(ip[1] << 16)+(ip[2] << 8)+ip[3];
    }

    public static String intToIp(int ip){
        StringBuffer sb = new StringBuffer();
        // 直接右移 24 位
        sb.append((ip >>> 24));
        sb.append(".");
        // 将高 8 位置0，然后右移 16 位
        sb.append(((ip & 0x00FFFFFF) >>> 16));
        sb.append(".");
        // 将高 16 位置0 ，然后右移 8 位
        sb.append(((ip & 0x0000FFFF) >>> 8));
        sb.append(".");
        // 将高 24 位置 0
        sb.append((ip & 0x00000FF));
        return sb.toString();
    }

    public static void main(String[] args){
        String ip = "192.168.10.66";
        int intIp = ipToInt(ip);
        System.out.println(intIp);
        System.out.println(intToIp(intIp));
    }
}
